package com.zenithmind.mall.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 秒杀活动实体 - 遵循单一职责原则，专门管理秒杀活动信息
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mall_seckill_activity")
public class SeckillActivity extends BaseEntity {

    /**
     * 活动名称
     */
    private String name;

    /**
     * 活动描述
     */
    private String description;

    /**
     * 活动开始时间
     */
    private LocalDateTime startTime;

    /**
     * 活动结束时间
     */
    private LocalDateTime endTime;

    /**
     * 活动状态（0-未开始，1-进行中，2-已结束，3-已取消）
     */
    private Integer status;

    /**
     * 活动类型（1-限时秒杀，2-整点秒杀，3-每日秒杀）
     */
    private Integer type;

    /**
     * 活动优先级（数字越大优先级越高）
     */
    private Integer priority;

    /**
     * 活动横幅图片
     */
    private String bannerImage;

    /**
     * 活动规则说明
     */
    private String rules;

    /**
     * 是否启用（0-禁用，1-启用）
     */
    private Integer enabled;

    /**
     * 排序号
     */
    private Integer sortOrder;

    // 业务方法

    /**
     * 检查活动是否未开始
     */
    public boolean isNotStarted() {
        return Objects.equals(this.status, 0);
    }

    /**
     * 检查活动是否进行中
     */
    public boolean isActive() {
        return Objects.equals(this.status, 1);
    }

    /**
     * 检查活动是否已结束
     */
    public boolean isEnded() {
        return Objects.equals(this.status, 2);
    }

    /**
     * 检查活动是否已取消
     */
    public boolean isCancelled() {
        return Objects.equals(this.status, 3);
    }

    /**
     * 检查活动是否启用
     */
    public boolean isEnabled() {
        return Objects.equals(this.enabled, 1);
    }

    /**
     * 检查活动是否在时间范围内
     */
    public boolean isInTimeRange() {
        LocalDateTime now = LocalDateTime.now();
        return (startTime == null || !now.isBefore(startTime)) &&
               (endTime == null || !now.isAfter(endTime));
    }

    /**
     * 检查活动是否可以参与
     */
    public boolean canParticipate() {
        return isEnabled() && isActive() && isInTimeRange();
    }

    /**
     * 检查是否限时秒杀
     */
    public boolean isLimitedTimeSeckill() {
        return Objects.equals(this.type, 1);
    }

    /**
     * 检查是否整点秒杀
     */
    public boolean isHourlySeckill() {
        return Objects.equals(this.type, 2);
    }

    /**
     * 检查是否每日秒杀
     */
    public boolean isDailySeckill() {
        return Objects.equals(this.type, 3);
    }

    /**
     * 启动活动
     */
    public void start() {
        if (isNotStarted() && isEnabled()) {
            this.status = 1;
        }
    }

    /**
     * 结束活动
     */
    public void end() {
        if (isActive()) {
            this.status = 2;
        }
    }

    /**
     * 取消活动
     */
    public void cancel() {
        if (!isEnded()) {
            this.status = 3;
        }
    }

    /**
     * 启用活动
     */
    public void enable() {
        this.enabled = 1;
    }

    /**
     * 禁用活动
     */
    public void disable() {
        this.enabled = 0;
    }

    /**
     * 获取活动状态名称
     */
    public String getStatusName() {
        if (status == null) return "未知";
        
        switch (status) {
            case 0: return "未开始";
            case 1: return "进行中";
            case 2: return "已结束";
            case 3: return "已取消";
            default: return "未知";
        }
    }

    /**
     * 获取活动类型名称
     */
    public String getTypeName() {
        if (type == null) return "未知";
        
        switch (type) {
            case 1: return "限时秒杀";
            case 2: return "整点秒杀";
            case 3: return "每日秒杀";
            default: return "未知";
        }
    }

    /**
     * 计算活动剩余时间（秒）
     */
    public Long getRemainingSeconds() {
        if (endTime == null) {
            return null;
        }
        
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(endTime)) {
            return 0L;
        }
        
        return java.time.Duration.between(now, endTime).getSeconds();
    }

    /**
     * 计算距离开始时间（秒）
     */
    public Long getSecondsToStart() {
        if (startTime == null) {
            return null;
        }
        
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(startTime)) {
            return 0L;
        }
        
        return java.time.Duration.between(now, startTime).getSeconds();
    }

    /**
     * 验证活动数据完整性
     */
    public boolean isValid() {
        return name != null && !name.trim().isEmpty() &&
               startTime != null &&
               endTime != null &&
               startTime.isBefore(endTime) &&
               status != null && status >= 0 && status <= 3 &&
               type != null && type >= 1 && type <= 3 &&
               enabled != null;
    }
}
